package com.cy.pj.common.pool;

import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

/*
 *创建一对象池类型，然后将此类型的对象交给spring管理
 * @Component  注解描述对象可以交给spring去管理，表示这个对象是一个一般组件
 * 系统底层会通过反射技术创建bean，并为bean起一个名字
 *
 * 反射？java中一种高级特性，这组特性会借助一组API，获取运行时的类及其成员，并进行操作。
 *反射的最大优势：不能预知未来，但可以驾驭未来
 *java中应用反射技术的起点时什么？获取Class对象(字节码对象)
 */
@Component
//@Scope("prototype")//prototype  为多实例作用域,每次从spring框架请求类的实例都会创建新的实例对象
@Scope("singleton")//注解用于设置bean对象的作用域,默认为springleton(单例),相同名字的bean重用,
@Lazy//描述对象类型时表现延迟的对象   的创建,何时需要何时创建,尤其是一些大对象,短时间又不会用到,我们可以采用这种方式
//@Component("objectPool")//描述bean的同事,给bean起个名字
public class ObjectPool {//默认bean对象的名字为类名,然后首字母小写,例如objectPool
    public ObjectPool(){
        System.out.println("构造方法执行了");
    }
    //生命周期方法演示:(并不是每个类中都要写这样的方法,一般在池对象的设计中会有这样的方法)
    @PostConstruct//此注解描述的方法为对象生命周期初始化方法,此方法会在构造方法之后执行  一般在池对象中使用
    public void init(){
        System.out.println("init()");
    }
    @PreDestroy//此注解描述的方法为对象生命周期销毁方法,此方法会在对象销毁之前执行
    public void destroy(){
        System.out.println("destory()");
    }
}//此类再被加载到内存时,会将类的配置信息存储到Map<String,BeanDefinition>容器中
//早起创建类的实例:new ObjectPool()，
//spring中为什么使用反射创建对象,而不是直接new,对象类型的方式呢？